package com.yichang.comisiones.dao.impl;

import com.yichang.comisiones.dao.ComisionVentaDao;
import com.yichang.comisiones.dto.ComisionVentaDTO;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.sql.DataSource;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.dao.EmptyResultDataAccessException;
import org.springframework.jdbc.core.BeanPropertyRowMapper;
import org.springframework.jdbc.core.simple.SimpleJdbcDaoSupport;
import org.springframework.stereotype.Repository;

/**
 *
 * @author josh
 */
@Repository
public class ComisionVentaDaoImpl extends SimpleJdbcDaoSupport implements ComisionVentaDao {

    private static Logger log = LoggerFactory.getLogger(ComisionVentaDaoImpl.class);

    @Autowired
    public ComisionVentaDaoImpl(DataSource dataSource) {
        log.info("Asignando el dataSource");
        setDataSource(dataSource);
    }
    
    private String getVentasTableName(Integer codigoMes){
        Map<String, Object> parametros = new HashMap<String, Object>();
        parametros.put("codigoMes", codigoMes);        
        StringBuilder sql = new StringBuilder();
        sql.append("select	distinct a11.PBTNAME  PBTNAME ");
        sql.append("from	PMT_VENTAS	a11 ");
        sql.append("join	ltm_mes	a12 ");
        sql.append("on 	(a11.cod_anio = a12.cod_anio) ");
        sql.append("where	a12.cod_mes in (:codigoMes) ");
        return getSimpleJdbcTemplate().queryForObject(sql.toString(), String.class, parametros);
    }

    @Override
    public List<ComisionVentaDTO> listarComisionVentaPorEmpleado(Integer codigoMes, String idEmpleado) {
        try {
            String ventasTableName = getVentasTableName(codigoMes);
            if (ventasTableName==null || ventasTableName.isEmpty()){
                return null;
            }
            Map<String, Object> parametros = new HashMap<String, Object>();
            parametros.put("codigoMes", codigoMes);
            parametros.put("idEmpleado", idEmpleado);
            StringBuilder sql = new StringBuilder();
            sql.append("select LTRIM(RTRIM(tspat_desc)) categoria, ");
            sql.append("        GrpMat_Desc subCategoria,  ");
            sql.append("    sum(WJXBFS1) ventas, ");
            sql.append("    sum(WJXBFS2) comisionVenta,  ");
            sql.append("    (case when sum(WJXBFS1) = 0 then 0 else sum(WJXBFS2)/sum(WJXBFS1)*100 end) factorMix ");
            sql.append("from( ");
            sql.append("select	a11.ven_kvgr1  tvv1t_codi,	 ");
            sql.append("        a19.tspat_desc  tspat_desc,	  ");
            sql.append("        a17.GrpMat_Desc  GrpMat_Desc,   ");
            sql.append("        sum(a11.ven_kzwi3s)  WJXBFS1,		 ");
            sql.append("        sum((a11.ven_porcom * a11.ven_kzwi3s))  WJXBFS2		");
            sql.append("from	").append(ventasTableName).append(" a11	 ");
            sql.append("        join	ltm_dia	a13	  on 	(a11.ven_fkdat = a13.Tmpo_Tiempo)	 ");
            sql.append("        join	mara	a14	  on 	(a11.ven_matnr = a14.mara_matnr)	 ");
            sql.append("        join	tspat	a19	  on 	(a14.mara_spart = a19.tspat_codi)	 ");
            sql.append("        join	tvv2t	a15	  on 	(a11.ven_zonalt = a15.tvv2t_codi)	 ");
            sql.append("        join	GrupoMaterial	a17	  on 	(a14.mara_gruprod = a17.GrpMat_Codi)	 ");
            sql.append("where	(a13.cod_mes in (:codigoMes)		 ");
            sql.append("and a11.ven_kvgr1 = :idEmpleado)	");
            sql.append("group by	 ");
            sql.append("        a11.ven_kvgr1,		 ");
            sql.append("        a19.tspat_desc,		 ");
            sql.append("        a17.GrpMat_Desc ");
            sql.append(")t0 ");
            sql.append("group by  ");
            sql.append("tspat_desc, ");
            sql.append("GrpMat_Desc ");
            sql.append("order by 1, 2 ");
            List<ComisionVentaDTO> tempResults = getSimpleJdbcTemplate().query(sql.toString(), new BeanPropertyRowMapper<ComisionVentaDTO>(ComisionVentaDTO.class), parametros);
            List<ComisionVentaDTO> resultadoFinal = new ArrayList<ComisionVentaDTO>();
            if (tempResults != null && !tempResults.isEmpty()) {
                String currentCategoria = null;
                String pivotCategoria = null;
                Double ventas = null;
                Double comisionVentas = null;
                ComisionVentaDTO comisionCategoria = null;
                for (ComisionVentaDTO comisionSubCategoria : tempResults) {
                    pivotCategoria = comisionSubCategoria.getCategoria();
                    if (currentCategoria == null || !currentCategoria.equalsIgnoreCase(pivotCategoria)) {
                        if (comisionCategoria != null) {
                            comisionCategoria.setComisionVenta(comisionVentas);
                            comisionCategoria.setVentas(ventas);
                            if (ventas!=null && ventas.doubleValue() != 0){
                                comisionCategoria.setFactorMix(comisionVentas / ventas);    
                            }       
                        }
                        ventas = comisionSubCategoria.getVentas();
                        comisionVentas = comisionSubCategoria.getComisionVenta();                        
                        comisionCategoria = new ComisionVentaDTO();
                        comisionCategoria.setCategoria(comisionSubCategoria.getCategoria());
                        resultadoFinal.add(comisionCategoria);
                        currentCategoria = pivotCategoria;
                    } else {
                        ventas += comisionSubCategoria.getVentas();
                        comisionVentas += comisionSubCategoria.getComisionVenta();
                    }
                    comisionCategoria.getComisionCategorias().add(comisionSubCategoria);
                }
                if (comisionCategoria != null) {
                    comisionCategoria.setComisionVenta(comisionVentas);
                    comisionCategoria.setVentas(ventas);
                    if (ventas != null && ventas.doubleValue() != 0) {
                        comisionCategoria.setFactorMix(comisionVentas / ventas);
                    }
                }                
            }
            return resultadoFinal;
        } catch (EmptyResultDataAccessException e) {
            return null;
        }
    }
}